const connectSql = require("./index")
const {resetEmptyValue} = require("../util");

/**
 * sql CRUD封装
 * @param sql String 查询ssql语句
 * @method 其他方法都是对sql进行拼接操作，
 * @return 除execute方法，其他返回当前对象，实现链式调用
 *
 */
class DB {
    constructor(sql) {
        // sql语句
        this.sql = sql;
    }

    // 增 表名（String）
    insert(tableName) {
        this.sql = `INSERT
        IGNORE INTO
        ${tableName} `;
        // 链式调用
        return this;
    };

    // 删 表名（String）
    delete(tableName) {
        this.sql = `DELETE
                    FROM ${tableName} `;
        // 链式调用
        return this;
    };

    // 查 @params 字段数组（Array<String>） @tableName(String) 表名 @isDefine 是否直接传入条件，默认false
    select(tableName, params, isDefine = false) {
        if (!isDefine) {
            // 查询的字段以数组形式传入
            params = Array.isArray(params) ? params : [];
            params = params.length ? params.join(',') : '*';
            this.sql = `SELECT ${params} `;
        } else {
            this.sql = `SELECT ${params} `
        }
        this.sql += `FROM ${tableName} `
        return this;
    }

    // 改 表名（String）
    update(tableName) {
        this.sql = `UPDATE ${tableName} `;
        return this;
    }

    // 列,{a:1,b:2}：列字段 新增row
    // 示例：(first_name,last_name,country )
    rows(values) {
        values = resetEmptyValue(values);
        let v = [];
        for (let key in values) {
            v.push(key);
        }
        v = v.join(',');
        this.sql += `(${v}) `;
        return this;
    }

    // 列，{a:1,b:2} 列值 新增value
    // 返回示例：('Mike','Christensen','USA' )
    values(values) {
        values = Array.isArray(values) ? values : [values];
        this.sql += "VALUES ";
        values.forEach((v, i) => {
            v = resetEmptyValue(v);
            let sql = "(";
            for (let key in v) {
                sql += `'${v[key]}',`
            }
            sql = sql.substring(0, sql.length - 1);
            if (i === values.length - 1) {
                this.sql += sql + ");"
            } else {
                this.sql += sql + "),"
            }
        });
        return this;
    }

    // 更新设置values值 set key=value值
    // 示例：(SET first_name='cs1',country='cs2' )
    set(values) {
        this.sql += "SET ";
        for (let key in values) {
            this.sql += `${key}='${values[key]}',`
        }
        this.sql = this.sql.slice(0, this.sql.length - 1) + ' ';
        return this
    }

    // where 条件
    // values value和key对象，isDefine:是否直接传入条件，默认false
    // first_name='Georgi' AND last_name='Facello'
    where(values, isDefine = false) {
        this.sql += `WHERE `;
        if (isDefine) {
            this.sql += values;
        } else {
            for (let key in values) {
                this.sql += `${key}='${values[key]}' AND ,`;
            }
            this.sql = this.sql.slice(0, this.sql.lastIndexOf(' AND ,')) + ';';
        }
        return this;
    }

    /**
     * 排序
     * @param field String 排序字段
     * @param value String 排序方式 DESC（升序） ASC（升序）
     */
    desc(field, value) {
        this.sql += `ORDER BY ${field} value`;
        return this
    }

    // 限定数量 v代表数量值
    limit(v = 10) {
        v = v ? v : 10
        this.sql += `LIMIT ${v} `;
        return this;
    }

    // 从多少条开始查询
    offset(v = 1) {
        v = v ? v : 1;
        this.sql += `OFFSET ${v} `
    }

    /**
     * execute，mysql执行操作操作
     * @param cb(params,rsults,fields) mysql查询结果回调
     * @param cb @param err 查询报错
     * @param cb @param results 结果
     * @param cb @param fields 查询字段
     */
    execute(res, cb) {
        const db = DBExample(this.sql);
        console.log(this.sql);
        return connectSql(db.sql, res, cb);
    }
}

// 实例化对象 initSql 初始化sql语句，默认为空字符串
const DBExample = (initSql = "") => {
    return new DB(initSql);
}

module.exports = DBExample;
